package com.atguigu.tingshu.user.service.impl;
import java.util.Date;

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Maps;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.account.client.UserAccountFeignClient;
import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.result.ResultCodeEnum;
import com.atguigu.tingshu.model.user.UserInfo;
import com.atguigu.tingshu.user.mapper.UserInfoMapper;
import com.atguigu.tingshu.user.service.WxLoginService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.SneakyThrows;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class WxLoginServiceImpl implements WxLoginService {

    @Autowired
    private WxMaService wxMaService;
    @Autowired
    private UserInfoMapper userInfoMapper;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Qualifier("com.atguigu.tingshu.account.client.UserAccountFeignClient")
    @Autowired
    private UserAccountFeignClient userAccountFeignClient;

    @Override // 重写父类方法
    @SneakyThrows // 抛出异常而不明确声明，Lombok库提供的注解
//    @Transactional // 声明该方法在事务管理下执行
    @GlobalTransactional // 声明该方法在全局事务下执行
    public Map<String, String> wxLogin(String code) throws WxErrorException {
        // 通过微信服务获取会话信息
        WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code);

        // 获取用户的openid
        String openid = sessionInfo.getOpenid();
        // 根据openid查询用户信息
        UserInfo userInfo = userInfoMapper.selectOne(new LambdaQueryWrapper<UserInfo>().eq(UserInfo::getWxOpenId, openid));

        // 如果用户信息不存在
        if (userInfo == null) {
            // 初始化新的用户信息
            userInfo = new UserInfo();
            // 设置用户昵称，使用当前时间戳生成唯一昵称
            userInfo.setNickname("谷粒听友" + System.currentTimeMillis());
            // 设置默认头像URL
            userInfo.setAvatarUrl("https://img0.baidu.com/it/u=997158719,3695758106&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500");
            // 设置用户的openid
            userInfo.setWxOpenId(openid);
            // 插入新用户信息到数据库
            userInfoMapper.insert(userInfo);

            Result result = userAccountFeignClient.initAccount(userInfo.getId());
            if (result.getCode() != 200) {
                throw new GuiguException(ResultCodeEnum.INIT_ACCOUNT_ERROR);
            }


        }



        // 生成唯一的token
        String token = UUID.randomUUID().toString().replace("-", "");
        // 将用户信息存储到Redis中，并设置过期时间
        redisTemplate.opsForValue().set(RedisConstant.USER_LOGIN_KEY_PREFIX + token, JSON.toJSONString(userInfo), RedisConstant.USER_LOGIN_KEY_TIMEOUT, TimeUnit.SECONDS);

        // 创建一个HashMap用于返回结果
        HashMap<String, String> map = new HashMap<>();
        // 将token添加到HashMap中
        map.put("token", token);

        // 返回包含token的HashMap
        return map;

    }

}
